﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CapaDeDominio;

namespace CapaDeDatos.EF
{
    public class ServicioDAO : IServicioDAO
    {
     
        #region IBaseDAO<Servicio,int> Members

        public Servicio Crear(Servicio ServicioAcrear)
        {

            using (EFContext db = new EFContext(ConexionUtil.ObtenerCadena()))
            {
                int? codigo = db.Servicios.Select(l => (int?)l.Codigo).Max();
                ServicioAcrear.Codigo = (codigo ?? 0) + 1;
                db.Servicios.Add(ServicioAcrear);
                db.SaveChanges();
            }
            return Obtener(ServicioAcrear.Codigo);

        
        }

        public Servicio Obtener(int Codigo)
        {

            using (EFContext db = new EFContext(ConexionUtil.ObtenerCadena()))
            {
                var servicio = from l in db.Servicios
                            where l.Codigo == Codigo
                            select l;
                return servicio.SingleOrDefault();
            }
        }

        public void Eliminar(Servicio itemEliminar)
        {
            using (EFContext db = new EFContext(ConexionUtil.ObtenerCadena()))
            {
                Servicio servicio = db.Servicios.Single(i => i.Codigo == itemEliminar.Codigo);
                db.Servicios.Remove(servicio);
                db.SaveChanges();
            }
        }

        public ICollection<Servicio> ListarTodos()
        {
            using (EFContext db = new EFContext(ConexionUtil.ObtenerCadena()))
            {
                var resultado = from l in db.Servicios
                                select l;
                return resultado.ToList();
            }
        }

        #endregion

        #region IServicioDAO
        /// <summary>
        /// Verificar el servicio por sala para que no sea repetido
        /// </summary>
        /// <param name="sala"></param>
        /// <returns></returns>
        public int VerificarXSala(Sala sala)
        {
            using (EFContext db = new EFContext(ConexionUtil.ObtenerCadena()))
            {
                var resultado = from l in db.Servicios
                                //where l.Salas.Codigo = sala.Codigo
                                select l.Codigo;

                return resultado.Count();
            }
        }

        /// <summary>
        /// es para verificar la cantidad de instrumentos por sala
        /// </summary>
        /// <param name="servicio"></param>
        /// <param name="sala"></param>
        /// <returns></returns>
        public int VerificarCantidadInstrumentos(Servicio servicio, Sala sala)
        {
            using (EFContext db = new EFContext(ConexionUtil.ObtenerCadena()))
            {
                var resultado = from l in db.Servicios
                                where l.Codigo == servicio.Codigo
                                //where l.Salas.codigo == sala.Codigo 
                                select l.Codigo;

                return resultado.Count();
            }
        }

        public ICollection<Servicio> ListarXBusqueda(string nombre, string descripcion, decimal? alquiler)
        {
            using (EFContext db = new EFContext(ConexionUtil.ObtenerCadena()))
            {
                var busqueda = from s in db.Servicios
                               select s;
                if (nombre != null)
                    busqueda = busqueda.Where(s => s.Nombre.Contains(nombre));
                if (descripcion != null)
                    busqueda = busqueda.Where(s => s.Descripcion.Contains(descripcion));
                if (alquiler != null)
                    busqueda = busqueda.Where(s => s.Alquiler== alquiler);
                return busqueda.ToList();
            }
        }

        #endregion
    }
}